#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;
class Solution
{
public:
    bool lemonadeChange(vector<int> &bills)
    {
        unordered_map<int, int> ansMap;
        // 5-10-20
        for (int bill : bills)
        {
            if (5 == bill)
            {
                ansMap[5]++;
            }
            else if (10 == bill)
            {
                //找零 5
                if (ansMap[5] != 0)
                {
                    ansMap[5]--;
                    ansMap[10]++;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                //找零 15- 10+5 或者5 5 5
                if (ansMap[5] != 0)
                {
                    if (ansMap[10] > 0)
                    {
                        ansMap[10]--;
                        ansMap[5]--;
                    }
                    else if (ansMap[5] >= 3)
                    {
                        ansMap[5] -= 3;
                    }
                    else
                    {
                        return false;
                    }
                    ansMap[20]++;
                }
                else
                {
                    return false;
                }
            }
        }
        return true;
    }

    bool lemonadeChange_2(vector<int> &bills)
    {
        // 其实这里存储5 10 即可，20不能退零
        int n = bills.size(), arr[3] = {0};
        if (bills[0] != 5)
            return false;
        arr[0]++;
        for (int i = 1; i < n; ++i)
        {
            if (bills[i] == 5)
                arr[0]++;
            else if (bills[i] == 10)
            {
                if (arr[0]--)
                    arr[1]++;
                else
                    return false;
            }
            else
            {
                if (arr[0] > 0)
                {
                    if (arr[1] > 0)
                    {
                        arr[1]--;
                        arr[0]--;
                    }
                    else if (arr[0] - 3 >= 0)
                    {
                        arr[0] -= 3;
                    }
                    else
                        return false;
                }
                else
                    return false;
                arr[2]++;
            }
        }
        return true;
    }
};
int main()
{
    Solution s;
    vector<int> bills = {5, 5, 10, 20, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 5, 5, 20, 5, 20, 5};
    cout << s.lemonadeChange(bills) << endl;
    return 0;
}